

package com.kimo.shop.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kimo.shop.bean.enums.ProdPropRule;
import com.kimo.shop.bean.model.ProdProp;
import com.kimo.shop.bean.model.ProdPropLang;
import com.kimo.shop.common.exception.KimoShopBindException;
import com.kimo.shop.common.i18n.LanguageEnum;
import com.kimo.shop.common.util.PageAdapter;
import com.kimo.shop.dao.CategoryPropMapper;
import com.kimo.shop.dao.ProdPropLangMapper;
import com.kimo.shop.dao.ProdPropMapper;
import com.kimo.shop.service.ProdPropService;
import com.kimo.shop.service.ProdPropValueService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Created by lgh on 2018/07/06.
 */
@Service
@AllArgsConstructor
public class ProdPropServiceImpl extends ServiceImpl<ProdPropMapper, ProdProp> implements ProdPropService {

    private final ProdPropMapper prodPropMapper;

    private final ProdPropValueService prodPropValueService;

    private final CategoryPropMapper categoryPropMapper;

    private final ProdPropLangMapper prodPropLangMapper;

    @Override
    public IPage<ProdProp> pagePropAndValue(ProdProp prodProp, Page<ProdProp> page) {

        page.setRecords(prodPropMapper.listPropAndValue(new PageAdapter(page), prodProp));
        page.setTotal(prodPropMapper.countPropAndValue(prodProp));
        return page;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveProdPropAndValues(ProdProp prodProp) {
        List<ProdProp> dbProdProp = prodPropMapper.getProdPropByPropNameAndShopId(prodProp.getPropName(), prodProp.getPropNameEn(),prodProp.getShopId(), prodProp.getRule());
        if (CollUtil.isNotEmpty(dbProdProp)) {
            // 已有相同名称规格
            throw new KimoShopBindException("kimo.same.specifications");
        }
        prodPropMapper.insert(prodProp);
        // 规格语言表
        saveProdPropLangList(prodProp);
        if (CollUtil.isEmpty(prodProp.getProdPropValues())) {
            return;
        }
        prodPropValueService.insertBatch(prodProp.getProdPropValues(),prodProp.getPropId());

    }

    private void saveProdPropLangList(ProdProp prodProp) {
        Long propId = prodProp.getPropId();
        String propName = prodProp.getPropName();
        String propNameEn = prodProp.getPropNameEn();
        List<ProdPropLang> list = new ArrayList<>();
        // 中文
        ProdPropLang prodPropZh = new ProdPropLang();
        prodPropZh.setPropId(propId);
        prodPropZh.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang());
        prodPropZh.setPropName(propName);
        list.add(prodPropZh);
        // 英文
        ProdPropLang prodPropEn = new ProdPropLang();
        prodPropEn.setPropId(propId);
        prodPropEn.setLang(LanguageEnum.LANGUAGE_EN.getLang());
        prodPropEn.setPropName(StrUtil.isNotBlank(propNameEn)?propNameEn:propName);
        list.add(prodPropEn);
        prodPropLangMapper.insertBatch(list);
    }


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateProdPropAndValues(ProdProp prodProp) {
        List<ProdProp> dbProdProp = prodPropMapper.getProdPropByPropNameAndShopId(prodProp.getPropName(), prodProp.getPropNameEn(),prodProp.getShopId(), prodProp.getRule());
        for (ProdProp prop : dbProdProp) {
            if (dbProdProp != null && !Objects.equals(prodProp.getPropId(), prop.getPropId())) {
                // 已有相同名称规格
                throw new KimoShopBindException("kimo.same.specifications");
            }
        }
        prodPropMapper.updateById(prodProp);
        // 更新规格语言表
        updateProdPropLang(prodProp);
        if (CollUtil.isEmpty(prodProp.getProdPropValues())) {
            return;
        }
        //更新规格值
        prodPropValueService.updatePropValues(prodProp.getPropId(), prodProp.getProdPropValues());
    }

    private void updateProdPropLang(ProdProp prodProp) {
        List<ProdPropLang> prodPropLangList = prodPropLangMapper.selectList(new LambdaQueryWrapper<ProdPropLang>().eq(ProdPropLang::getPropId, prodProp.getPropId()));
        for (ProdPropLang prodPropLang:prodPropLangList){
            if (prodPropLang.getLang().equals(LanguageEnum.LANGUAGE_EN.getLang())){
                prodPropLang.setPropName(prodProp.getPropNameEn());
            }else {
                prodPropLang.setPropName(prodProp.getPropName());
            }
            prodPropLangMapper.updateByPropIdAndLang(prodPropLang);
        }

    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteProdPropAndValues(Long propId, Integer propRule, Long shopId) {
        int deleteRows = prodPropMapper.deleteByPropId(propId, propRule, shopId);
        // 商品规格语言表
        prodPropLangMapper.deleteByPropId(propId);
        if (deleteRows == 0) {
            return;
        }
        // 删除原有的属性值
        prodPropValueService.deleteByPropId(propId);
        // 如果是参数，删除参数与分类关联信息
        if (ProdPropRule.ATTRIBUTE.value().equals(propRule)) {
            categoryPropMapper.deleteByPropId(propId);
        }
    }

    @Override
    public List<ProdProp> listByCategoryId(Long categoryId) {
        return prodPropMapper.listByCategoryId(categoryId);
    }

    @Override
    public List<ProdProp> listByLang(ProdProp prodProp) {
        return prodPropMapper.listByLang(prodProp);
    }
}
